import etiquetas
import memoria
from Stan import *
import sys

def _anyadeAuxiliares(c):
  sigue= etiquetas.nueva()
  test= etiquetas.nueva()
  sal= etiquetas.nueva()
  c.append(Etiqueta("escribe"))
  c.append(SWAP())
  c.append(POP(MD(memoria.TMP)))
  c.append(JMP(test))
  c.append(PUSH(MI1(0,memoria.TMP),None,sigue))
  c.append(COUT())
  c.append(INC(MD(memoria.TMP)))
  c.append(PUSH(MI1(0,memoria.TMP),None,test))
  c.append(BRD(sigue))
  c.append(RET("Fin de escribe", sal))

def gencodigo(principal, funciones, cadenas, variables, name):
  memoria.asignaDir(variables)
  memoria.asignaDirCad(cadenas)

  codigo= []
  memoria.inicializaRegistros(codigo)
  for cad in cadenas:
    aux=True
    for v in cadenas:
        if cad.v==v.v and cadenas.index(cad)<cadenas.index(v):
            aux=False
    if aux:
        cad.inicializacion(codigo)
  for f in funciones:
    f.fijaDireccion()
  codigo.append(Comentario("Comienzo del programa:"))

  principal.generaCodigo(codigo)
  codigo.append(HALT("Fin del programa"))
  for f in funciones:
    f.generaFuncion(codigo)
  _anyadeAuxiliares(codigo)
  try:
    fsalida= open(name+".sly", "w")
  except:
    sys.stderr.write("No he podido abrir a.sly para escritura.\n")
    sys.exit(1)
  for s in codigo:
    fsalida.write("%s\n" % s)
